/*
 * main.cpp
 *
 *  Created on: 16/10/2012
 *      Author: vagner
 */
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "IOManager.h"
#include "Grafo.h"
#include "Individuo.h"
#include "Populacao.h"
#include "ParametrosManager.h"
#include <sstream>

using namespace computacaoNatural;

int main(int argc, char **argv) {

	IOManager iomanager;
	std::vector<int> valoresLidos;
	std::string linhaLida;
	int numMedianas;
	int numVertices;
	int verticesLidos = 0;
	Grafo* grafo = 0;
	Vertice auxVertice;
	Populacao* pPopulacao = 0;
	int geracoes;
	ParametrosManager parametros;
	double melhorFitness, piorFitness, fitnessMedia;
	int indexMelhor,indexPior;
	std::stringstream outString;

	iomanager.validaEntrada(argc);
	iomanager.abreArquivoEntrada(argv[2]);
	iomanager.abreArquivoSaida(argv[4]);

	linhaLida = iomanager.leiaProxLinha();
	iomanager.splitEmVetor(linhaLida, valoresLidos);

	numVertices = valoresLidos.at(0);
	numMedianas = valoresLidos.at(1);
	valoresLidos.clear();
	grafo = new Grafo(numVertices);

	while( (linhaLida = iomanager.leiaProxLinha()) != "EOF"){

		iomanager.splitEmVetor(linhaLida,valoresLidos);

		auxVertice.idVertice = verticesLidos;
		auxVertice.coorX = valoresLidos.at(0);
		auxVertice.coorY = valoresLidos.at(1);
		auxVertice.capacidade = valoresLidos.at(2);
		auxVertice.demanda = valoresLidos.at(3);

		grafo->insereVertice(auxVertice);
		valoresLidos.clear();
		verticesLidos++;
	}
	grafo->calculaMatrizDistancia();
	pPopulacao = new Populacao(numVertices, numMedianas,grafo,&parametros);
	pPopulacao->avaliaFitness();


	pPopulacao->selecaoNatural();

	for(geracoes = 0; geracoes < parametros.MAX_GERACOES; geracoes++){
		//std::cout << "Geracao: " << geracoes << std::endl;
		pPopulacao->avaliaFitness();
		pPopulacao->aplicaOperadoresGeneticos();
		pPopulacao->calculaMelhorPiorFitness(&melhorFitness,&indexMelhor, &piorFitness, &indexPior);
		fitnessMedia = pPopulacao->calculaFitnessMedia();
		outString << geracoes <<";" << melhorFitness <<";"<< piorFitness <<";"<< fitnessMedia;
		iomanager.escreveArquivoSaida(outString.str());
		outString.str("");
	}
	std::cout<<"Individuo solução:";
	pPopulacao->showIndividuo(indexMelhor);

	delete grafo;
	delete pPopulacao;
	std::cout << "Everything is gonna be alright." << std::endl;
	return EXIT_SUCCESS;
}



